package com.example.hbsm_video.controller;

import java.util.List;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.example.hbsm_video.entity.User;
import com.example.hbsm_video.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/register")
    public boolean register(@RequestBody User user) {
        // 根据用户名查询用户是否存在
        boolean exists = userService.exists(Wrappers.query(User.class).eq("username", user.getUsername()));
        if (exists) {
            // 用户已存在
            return false;
        }

        // 生成随机盐(token)
        String salt = RandomUtil.randomString(16);
        // 将密码和盐组合
        String pwd = user.getPassword() + salt;
        // 使用 md5 算法对组合后的密码加密
        pwd = SecureUtil.md5(pwd);
        // 将加密后的密码和随机盐设置到对象中
        user.setPassword(pwd);
        user.setSalt(salt);
        // 将数据持久化到数据库
        return userService.save(user);
    }

    @PostMapping("/login")
    public boolean login(@RequestParam String username, @RequestParam String password) {
        // 根据用户名查询用户信息，包含随机盐
        User user = userService.getOne(Wrappers.query(User.class).eq("username", username));

        if (user == null) {
            // 用户不存在
            return false;
        }

        // 将输入的密码和盐组合进行 md5 加密
        String salt = user.getSalt();
        String pwd = password + salt;
        String encryptedPwd = SecureUtil.md5(pwd);

        // 将加密后的密码与数据表中的密码比对
        if (encryptedPwd.equals(user.getPassword())) {
            return true;
        } else {
            return false;
        }
    }

    @PutMapping("/update")
    public boolean update(@RequestBody User user) {
        return userService.updateById(user);
    }

    @GetMapping("/list")
    public List<User> list() {
        return userService.list();
    }

    @DeleteMapping("/delete/{id}")
    public boolean delete(@PathVariable Long id) {
        return userService.removeById(id);
    }
}